/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package figura.personajes;

import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.net.URL;
import java.util.ArrayList;
import javax.imageio.ImageIO;

/**
 *
 * @author jfj
 */
public class Player extends Personaje {

    BufferedImage frame_actual = null; //contendra el frame a pintar en pantalla
    private Double maxima_velocidad = 3.0;  //es la maxima velocidad que podra llevar
    private boolean desacelerandose = false; //indica si esta desacelerando el muñeco
    private int posicionFrame = 0; //posicion inicial
    private boolean darLaVuelta = false;  //variable de control de frames
    /**
     *-1: parado
     * 0: izquierda
     * 1: derecha
     * 2: salto
     * 3: agacharse
     * 4: salto-izquierda
     * 5: salto-derecha
     */
    public int direccion_movimiento = -1; //0: izquerda, 1: derecha, -1: parado, 2: salto
    //control del salto : intentar ver si se puede poner aparte en una clase o algo
    private boolean estaSaltando = false; //indica si el muñeco salta. Si lo hace, no podra hacer nada mas
    private Double salto = 4.0; //
    private Double aceleracionSalto = 1.0;
    private Double alturaSalto = 4.0; //altura maxima que salta
    private Double incrementoSalto = .0;
    private boolean estaCayendo = false;
    public int bufferMovimiento = -1; //buffer para poner la direccion de movimiento despues de saltar

    //agacharse
    private boolean agachado = false;

    public void Player() {

        carga_frames();
        setPosX(50.0);
        setPosY(300.0);
    }

    public boolean isEstaSaltando() {
        return estaSaltando;
    }

    public void setEstaSaltando(boolean estaSaltando) {
        this.estaSaltando = estaSaltando;
    }

    public boolean isEstaCayendo() {
        return estaCayendo;
    }

    public void setEstaCayendo(boolean estaCayendo) {
        this.estaCayendo = estaCayendo;
    }

    public boolean isAgachado() {
        return agachado;
    }

    public void setAgachado(boolean agachado) {
        this.agachado = agachado;
    }

    
    @Override
    public void carga_frames() {
        ArrayList listaFrames = getFrames();
        listaFrames.add("artur.PNG");  //0
        listaFrames.add("artur1.PNG"); //1
        listaFrames.add("artur2.PNG"); //2
        listaFrames.add("artur3.PNG"); //3
        listaFrames.add("artur4.PNG"); //4
        listaFrames.add("artur1_i.PNG"); //5
        listaFrames.add("artur2_i.PNG");  //6
        listaFrames.add("artur3_i.PNG");  //7
        listaFrames.add("artur4_i.PNG");  //8
        listaFrames.add("artur_i.PNG");  //9
        setFrames(listaFrames);
    }

    public BufferedImage loadImage(String nombre) {
        URL url = null;

        try {
            url = new URL("file:" + nombre);
            return ImageIO.read(url);
        } catch (Exception e) {
            System.out.println("No se pudo cargar la imagen " + nombre + " de " + url);
            System.out.println("El error fue : " + e.getClass().getName() + " " + e.getMessage());
            return null;
        }
    }

    public BufferedImage getSprite(int pos) {
        if (getFrames() != null) {
            try {
                BufferedImage img = loadImage(System.getProperty("user.dir") + "\\src\\recursos\\gng\\" + getFrames().get(pos));
                return img;
            } catch (Exception e) {
                e.printStackTrace();
                System.out.println("Falla en posicion " + pos);
            }        
        }
        return null;
    }

    @Override
    public void paint(Graphics g) {
        if (frame_actual == null) {
            frame_actual = getSprite(actualiza_frame(direccion_movimiento));
            g.drawImage(frame_actual, getPosX().intValue(), getPosY().intValue(), this);
        } else {
            frame_actual = getSprite(actualiza_frame(direccion_movimiento));
            g.drawImage(frame_actual, getPosX().intValue(), getPosY().intValue(), this);
        }
    }

    @Override
    public void aceleracion() {
        if (getVelocidad() < maxima_velocidad) {
            setAceleracion(getAceleracion());            
            super.aceleracion();
        }
    }

    public void desaceleracion() {
        if (getVelocidad() > 0) {
            //setVelocidad(-0.3);
            setAceleracion(-(0.5));
            super.aceleracion();
            if (direccion_movimiento == 0) {
                mueve_izquierda();
            }
            if (direccion_movimiento == 1) {
                mueve_derecha();
            }
        } else {
            setDesacelerandose(false);
            setAceleracion(1.0);
            setVelocidad(0.0);
            direccion_movimiento = -1;
        }


    }

    public boolean isDesacelerandose() {
        return desacelerandose;
    }

    public void setDesacelerandose(boolean desacelerandose) {
        this.desacelerandose = desacelerandose;
    }

    /**
     * 0: izquierda
     * 1: derecha
     */
    public int actualiza_frame(int direccion) {

        if (direccion_movimiento == -1) {
            if ( bufferMovimiento == 1){
                // bufferMovimiento = -1;
                return 0;
            } else if (bufferMovimiento == 0){
                //bufferMovimiento = -1;
                return 9;
            } else {
                return 0;
            }
        }

        if (direccion == 1) {

            if (posicionFrame > 4 || posicionFrame < 1) {
                posicionFrame = 1;
            }
            if (posicionFrame == 4) {
                darLaVuelta = true;
            }
            if (posicionFrame == 1) {
                darLaVuelta = false;
            }
            if (darLaVuelta) {
                posicionFrame--;
            } else {
                posicionFrame++;
            }
            return posicionFrame;
        }
        if (direccion == 0) {
            if (posicionFrame > 8 || posicionFrame < 5) {
                posicionFrame = 5;
            }
            if (posicionFrame == 8) {
                darLaVuelta = true;
            }
            if (posicionFrame == 5) {
                darLaVuelta = false;
            }
            if (darLaVuelta) {
                posicionFrame--;
            } else {
                posicionFrame++;
            }
            return posicionFrame;
        }
        return 0;  //por defecto
    }

    public void setPosicionFrame(int posicionFrame) {
        this.posicionFrame = posicionFrame;
    }

    public void saltar() {
        if (salto > 0) {
            salto -= aceleracionSalto;
            incrementoSalto = alturaSalto + Math.pow(-salto, 2);
            setPosY(getPosY() - incrementoSalto);
            if (direccion_movimiento == 4) {
                mueve_izquierda();
            }
            if (direccion_movimiento == 5) {
                mueve_derecha();
            }

        } else {
            setEstaCayendo(true);
            setEstaSaltando(false);
            salto = -1.0;
        }

    }

    public void caer() {
        if (salto < 3.0) {
            salto += aceleracionSalto;
            incrementoSalto = alturaSalto + Math.pow(-salto, 2);
            setPosY(getPosY() + incrementoSalto);
            if (direccion_movimiento == 4) {
                mueve_izquierda();
            }
            if (direccion_movimiento == 5) {
                mueve_derecha();
            }
        } else {
            setEstaCayendo(false);
            salto = 4.0;
            direccion_movimiento = bufferMovimiento;
            bufferMovimiento = -1;
        }
    }
}
